package ModelAndController;
/*
 * Az inverter hálózati elemet megvalósító osztály. 
 * A kapu egyetlen bemenetének logikai értéke áll rendelkezésre, 
 * melyet invertálva az egyetlen kimenetén a belső állapottal tér vissza. 
 */
//Exception 60 es 79 kozott
public class Inverter extends Element{
	//Az inverter belső állapotát tárolja.
	private int state;
	//konstruktor
	public Inverter(){
		state = -1;
	}
	/*
	Az elem belső állapotának változását végzi a bemenet értékének függvényében. 
	Ha az adott elem változott, akkor azt jelzi a visszatérési értéken.
	 */
	public boolean isUpdateSuccess(){
		boolean retValue = false;
		if(shouldUpdate){
			retValue = actualUpdate();
			shouldUpdate = false;
		}
		buffer = Integer.toString( state );
		return retValue;
	}
	//Kiszámolja,hogy a bemenetek alapján milyen állapotot kell felvennie és 
	//ha az állapota ezzel változik,akkor meghívja a megfelelő függvényt
	private boolean actualUpdate(){
		boolean retValue = false;
		int newState = inputWires[0].getState();
		if(newState == 0)
			newState = 1;
		else
			newState = 0;
		
		if(newState != state){
			stateChangeAndNotifyOutputWires(newState);
			retValue = true;
		}
		return retValue;
	}
	//Az elem állapotát állítja be és tájékoztatja a hozzá kapcsolódó huzalokat
	private void stateChangeAndNotifyOutputWires(int newState){
		state = newState;
		
		allOutputWiresShouldUpdate();
	}
	//Az elem belső állapotának értékét adja vissza.
	public int getState(int nbOfOutput){
		return state;
	}
	//Az inverter csak egy kimeneti huzallal rendelkezik
	public void setOutputNumbers(int nbOfOutput) throws Exception{
		if(nbOfOutput != 1)
			throw new Exception("61");
		outputWires = new Wire[nbOfOutput][];
	}
	//Az inverter csak egy bemeneti huzallal rendelkezik
	public void setInputWireNumbers(int nbOfInputWires) throws Exception{
		if( nbOfInputWires != 1 )
			throw new Exception("60");
		inputWires = new Wire[1];
	}	
}
